import router from '../router'

/**
 * 将对象序列化后方便放到url上
 * @param obj {object} 对象中各key对应的value值请使用简单的值，不要传什么对象数组之类的
 * @returns {string}
 */
const serializeObject = (obj) => Object.keys(obj).map((key) => `${key}=${obj[key] || ''}`).join('&')

// 获取要带到页面上的公共参数
const getCommonUrlParams = () => ({
  s: 'source1', // 来源
})

/**
 * 跳到新页面
 * @param pathname {string} 要跳转的地址（不含参数），如果是在本单页应用内部跳转，直接给`/`开头的路径，如果要跳转到外部给`http(s)://`开头的地址
 * @param query {object} url上要带的参数（对象形式）
 * @param replace {boolean} 若为true，不会新增历史记录，直接替换当前历史记录
 */
export const goPage = ({ pathname, query, replace }) => {
  const finalQuery = { ...getCommonUrlParams(), ...query }

  if (pathname.startsWith('/')) {
    if (replace === true) {
      router.replace({ path: pathname, query: finalQuery })
    }
    router.push({ path: pathname, query: finalQuery })
    return
  }

  const targetUrl = `${pathname}?${serializeObject(finalQuery)}`
  if (replace === true) {
    location.replace(targetUrl)
    return
  }
  location.href = targetUrl
}

/**
 * 将当前页替换成新的地址（不增加历史记录，直接替换当前记录）
 * @param pathname {string} 要跳转的地址（不含参数），如果是在本单页应用内部跳转，直接给`/`开头的路径，如果要跳转到外部给`http(s)://`开头的地址
 * @param query {object} url上要带的参数（对象形式）
 */
export const replacePage = ({ pathname, query }) => goPage({ pathname, query, replace: true })
